/**
 *******************************************************************************
 * UserModel.java
 *
 * (c) Copyright 2009 YangYan
 *
 *＜所属工程名＞
 *  JavaWeb(JavaWeb示例工程)
 *＜功能概要＞
 *  演示在图片中加入logo图片和文字水印
 *＜作者＞
 *  杨砚
 *******************************************************************************
 */
package com.sanlian.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.ImageIcon;

import org.apache.log4j.Logger;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;

/**
 * 演示在图片中加入logo图片和文字水印
 * 
 * 
 * @author 杨砚
 */
public class ImageHandlerServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * ImageHandlerServlet构造方法
	 */
	public ImageHandlerServlet() {
		super();
	}

	/**
	 * （重写方法） doGet方法
	 * 
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}

	/**
	 * （重写方法） doPost方法
	 * 
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Logger.getLogger(ImageHandlerServlet.class).debug("debug log com.sanlian.servlet.ImageHandlerServlet.doPost() start");
		Logger.getLogger(ImageHandlerServlet.class).info("debug log com.sanlian.servlet.ImageHandlerServlet.doPost() start");
		// 获取img文件夹绝对路径
		String imgPath = this.getServletContext().getRealPath("/") + "img/";
		// 得到star.jpgJPEG图像数据输入流
		InputStream inputStream = new FileInputStream(new File(imgPath
				+ "star.jpg"));
		// 通过JPEG图像数据输入流创建JPEG数据流解码器
		JPEGImageDecoder jpegImageDecoder = JPEGCodec
				.createJPEGDecoder(inputStream);
		// 解码当前的JPEG数据流，返回BufferedImage对象
		BufferedImage bufferedImage = jpegImageDecoder.decodeAsBufferedImage();
		// 得到Graphics对象，用于在BufferedImage对象上绘图和输出文字
		Graphics graphics = bufferedImage.getGraphics();
		// 获取ImageIcon对象用于获取Image对象
		ImageIcon imageIcon = new ImageIcon(imgPath + "google.jpg");
		// 获取Image对象
		Image image = imageIcon.getImage();
		// 将水印图片google.jpg绘制在图片上
		graphics.drawImage(image, 80, 80, null);
		// 设置图形上下文的当前颜色(这里设置了以后在图片上下文添加文字时就会使用该颜色)
		graphics.setColor(Color.RED);
		// 实例化一个Font对象，用于设置字体格式
		Font font = new Font("宋体", Font.BOLD, 20);
		// 通过Font对象设置字体格式
		graphics.setFont(font);
		// 在图片上添加yoyoyo文字
		graphics.drawString("杨砚", 10, 20);
		// 释放图形上下文使用的系统资源
		graphics.dispose();
		// 设置response返回类型
		response.setContentType("image/jpeg");
		// 从response中获取ServletOutputStream(servlet输出流)对象
		ServletOutputStream servletOutputStream = response.getOutputStream();
		// 使用支持给定格式的任意 ImageWriter 将一个图像写入 ImageOutputStream
		ImageIO.write(bufferedImage, "jpeg", servletOutputStream);
		/*
		 * 本段代码是书上的代码，比较麻烦。创建JPEG图像编码器，用于编码内存中的图像数据到JPEG数据输出流 JPEGImageEncoder
		 * jpegImageEncoder = JPEGCodec .createJPEGEncoder(servletOutputStream);
		 * 编码BufferedImage对象到JPEG数据输出流 jpegImageEncoder.encode(bufferedImage);
		 */
		// 关闭star.jpgJPEG图像数据输入流
		inputStream.close();
		// 关闭servlet输出流
		servletOutputStream.close();
		Logger.getLogger(ImageHandlerServlet.class).debug("debug log com.sanlian.servlet.ImageHandlerServlet.doPost() end");
		Logger.getLogger(ImageHandlerServlet.class).info("debug log com.sanlian.servlet.ImageHandlerServlet.doPost() end");
	}

}
